package com.huluobo.a2205kotlinjetpackdemo.paging

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.LinearLayoutManager
import com.huluobo.a2205kotlinjetpackdemo.R
import com.huluobo.a2205kotlinjetpackdemo.databinding.ActivityPagingBinding
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.launch

/**
 * Paging总结:
 * paging是page的进行时,也就是分页,之前SmartRefreshLayout,活着其他下拉刷新框架, 都是用于页面的分页加载
 * paging3是google推出的分页加载库,主要用于无感加载
 *
 * 1.Paging中最关键的数据传递 Repo.getPagingData().cachedIn(viewModelScope) 生成一个flow流,在activty中通过      vm.getPagingData().collect {来接收数据流
 * .cachedIn( 可以将请求到的数据缓存到协程作用域中,如果生命周期发生改变的时候,可以直接读取这部分数据
 * 2.PagingConfig pageSize 和page用于来设置预加载的大小
 * 3.RepoPagingSource 重写load方法,加载数据,请求接口
 * 4.RepoPagingSource 是真正产生数据源的位置,在这当中触发了网络请求
 * 5.PagingAdapter 是配合paging框架使用的,构造方法中需要传递一个DiffUtils,来管理item中数据是否一致,如果一致则不添加
 * 6.paging给adapter传递数据的位置是adapter.submitData(it) ,通过协程的flow流从viewModel中拿到数据并填充
 */
class PagingActivity : AppCompatActivity() {
    private lateinit var binding: ActivityPagingBinding
    private val adapter = PagingAdapter()
    private val vm by lazy { ViewModelProvider(this)[PagingViewModel::class.java] }
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityPagingBinding.inflate(layoutInflater)
        setContentView(binding.root)

        binding.pagingRv.layoutManager = LinearLayoutManager(this)
        binding.pagingRv.adapter = adapter

        lifecycleScope.launch {
            vm.getPagingData().collect {
                adapter.submitData(it)
            }
        }
    }
}